package com.atguigu.gmall.common.intercepator;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @author wk
 * @create 2021-09-08 19:22
 * 在进行服务之间的远程调用时 可能部分微服务都会需要这个用户id
 * 可以配置一个拦截器 当所有的微服务在进行远程调用时
 * 如果需要用户id先实例拦截器  然后通过拦截器携带用户id 可以一劳永逸
 */
// @Component // 不直接加入到容器中进行实例化 哪个微服务如果需要 可在主启动类中 实例化 即可使用
public class FeignInterceptor implements RequestInterceptor {
    // 远程调用之前调用此方法
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 1.先获取在网关过滤器处设置的用户id
        // ServletRequestAttributes是RequestAttributes 的实现类
        // ServletRequestAttributes中可以获取请求 响应对象
        ServletRequestAttributes servletRequestAttributes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        // 判断
        if (servletRequestAttributes != null) {
            HttpServletRequest request = servletRequestAttributes.getRequest();
            if (request != null) {
                String userId = request.getHeader("userId");
                if (!StringUtils.isEmpty(userId)) {
                    // 2.将用户id和临时id设置在请求头中
                    // 并发送远程调用
                    requestTemplate.header("userId", userId);
                }
                String userTempId = request.getHeader("userTempId");
                if (!StringUtils.isEmpty(userTempId)) {
                    requestTemplate.header("userTempId", userTempId);
                }

            }
        }
    }
}
